<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>函数柯里化</title>
</head>
<body>
    
<script>

    /*
        函数柯里化：通过函数调用继续返回函数的方式，实现多次接收参数最后统一处理的函数编码形式。
    */

    // 普通函数
    function foo(a, b, c){
        return a + b + c;
    }
    // console.log(foo(1, 2, 3)); // 6
    // 函数柯里化的过程
    function foo1(a){
        return function(b){
            return function(c){
                return a + b + c;
            }
        }
    }
    // foo1(1)(2)(3); // 6

    // 手写自动实现柯里化的函数
    function currying(fn){
        return function curriedFn(...args){
            /*
                1. 如果所传递的函数小于所需的函数个数 那么返回一个函数继续接收参数 
                2. 如果所传递的函数参数大于或等于所需的函数个数，那么直接执行函数
            */
            if(args.length >= fn.length){ // 直接执行函数
                return fn(...args)
            }else{ // 继续接受参数 返回新的函数
                return function(...args2){
                    return curriedFn(...args, ...args2)
                }
            }
        }
    }

    const bar = currying(foo)
    console.log(bar(10)(50)(40));
    console.log(bar(10)(20)(30))  

</script>

</body>
</html>